package com.jxm.optional;

import org.junit.Test;

import java.util.Optional;

/**
 * 例子
 * @author jiaxXM
 * @date 2024/9/13
 */
public class MyExample {

    @Test
    public void test1(){
        //1. 创建 Optional 对象
        // 创建一个非空的 Optional
        Optional<String> nonEmptyOptional = Optional.of("Hello, World!");
//        System.out.println(nonEmptyOptional.get());
        // 创建一个可以为空的 Optional
        Optional<String> nullableOptional = Optional.ofNullable(null);
//        System.out.println(nullableOptional.orElse("默认值"));

        // 创建一个空的 Optional
        Optional<String> emptyOptional = Optional.empty();
//        System.out.println(emptyOptional.orElse("默认值"));

        //2. 检查值是否存在
        if (nonEmptyOptional.isPresent()) {
            //使用 get() 方法可以获取 Optional 中的值，但如果值不存在会抛出 NoSuchElementException。为了安全起见，通常建议使用其他方法
            System.out.println("nonEmptyOptional=======:"+nonEmptyOptional.get());
        }

        //4. 提供默认值
        String value1 = nullableOptional.orElse("Default Value");
        System.out.println(value1); // 输出 "Default Value"

        //5. 使用 Lambda 表达式
        nonEmptyOptional.ifPresent(value -> System.out.println(value));

        //6. 处理缺失的值
        String value = nullableOptional.orElseGet(() -> "Generated Default Value");
        System.out.println(value); // 输出 "Generated Default Value"

        //7. 处理缺失的值并抛出异常
        String value2 = nullableOptional.orElseThrow(() -> new IllegalArgumentException("Value is missing"));

        //8. 链式操作
//        Optional<String> upperCaseOptional = nonEmptyOptional.map(String::toUpperCase);
//        upperCaseOptional.ifPresent(System.out::println); // 输出 "HELLO, WORLD!"

        /**
         * 总结：
         * 如果你直接使用 optional.get() 方法来获取值，而 optional 是空的，则会抛出 NoSuchElementException。
         * 为了安全获取值，你可以使用 isPresent()、orElse()、orElseGet() 或 orElseThrow() 等方法。
         */
    }
}
